package Package10_8;

import java.util.Scanner;
import java.util.Stack;

public class SingleLinkedListTest {
    public static void main(String[] args) {
        //创建单链表
        HeadNode head=new HeadNode();
       //创建几个结点
        SingleNode node1=new SingleNode(13,"张三");
        SingleNode node2=new SingleNode(14,"王四");
        SingleNode node3=new SingleNode(15,"李五");
        //创建需要反转的单链表
        head.addNode(node1);
        head.addNode(node2);
        head.addNode(node3);
        head.PrintLinked();

        System.out.println("<<反转链表>>");
        //反转链表
        head.ReverseLinked(head).PrintLinked();


    }
}

//头结点
class HeadNode{
    private SingleNode head=new SingleNode(0,"");

    //反转链表
    public HeadNode  ReverseLinked(HeadNode srcHead){
        //思路，将遍历到的每一个节点都插入到新链表的第一个结点的位置
        HeadNode destHead=new HeadNode();
        SingleNode temp=head.next;
        SingleNode insert;
        if(head.next==null){
            throw new RuntimeException("链表为空！");
        }
        while(temp!=null){
            insert=temp;
            insert.next=head.next;
            head.next=insert;
            temp=temp.next;
        }
        return destHead;

    }

    //添加节点
    public  void addNode(SingleNode newNode){//头结点和要插入的结点
        SingleNode temp=head;
       while(temp.next!=null){
           temp=temp.next;//没有到最后一个位置就一直找
       }
       //找到了，就将新结点插入进去
        temp.next=newNode;

    }


    //删除节点

    public void DelLinked(int index){//传参：要删除的结点编号
        //删除节点，要找到要删除节点的前一个节点
        SingleNode temp=head;
        int i=0;
        //判断索引是否存在
        if(getNodeNum()<index){
            throw new RuntimeException("超出链表的长度，当前链表的长度为："+getNodeNum());
        }
        while(i<index-1){
            temp=temp.next;
            ++i;
        }
        //这里就是要删除节点的前一个节点
        if(temp.next.next!=null){
            temp.next=temp.next.next;
        }else {
            temp.next=null;
        }
    }
    //修改结点信息
    public void AlterNode(SingleNode node){//要修改的结点
        Scanner sc=new Scanner(System.in);
        SingleNode temp=head;
        while(temp!=node){
            //没找到就一直找
            temp=temp.next;
        }
        //找到就修改
        System.out.println("请输入修改后的姓名：");
        String name=sc.nextLine();
        temp.setName(name);
        System.out.println("请输入修改后的年龄：");
        int age=sc.nextInt();
        temp.setAge(age);
    }
    //判断链表里的结点的个数
    public int getNodeNum(){
        SingleNode temp=head;
        int i=0;
        while(temp.next!=null){
            temp=temp.next;
            i++;
        }
        return i;
    }

    //遍历单链表
    public void PrintLinked(){
        SingleNode temp=head.next;
        while(temp!=null){
            System.out.println("年龄："+temp.getAge()+"，姓名："+temp.getName());
            temp=temp.next;//temp=temp.next
        }

    }

}


//创建的单个节点
class SingleNode{//表示每一个节点
    //定义姓名，年龄两个属性
    public int age;
    public String name;
    public SingleNode next;

    public SingleNode(int age,String name){//带参构造
        this.age=age;
        this.name=name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getAge() {
        return age;
    }

}